﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using System.Linq;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.ImportacaoExportacao.Presenter;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;

namespace Sinacor.UI.Bovespa.ImportacaoExportacao.View.SmartClient
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class Exportacoes : SinacorWindow, IImportacaoExportacaoBase, IExportacaoNegocio
    {
        #region Propriedades

        public IImportacaoExportacaoPresenter PresenterAtual
        {
            get;
            set;
        }

        #endregion
        
        #region Construtor

        public Exportacoes(Model.Enum.TipoSistema tipoSistema)
        {
            InitializeComponent();

            this.IniciarObjetos(tipoSistema);

            this.EsconderParametros();
        }

        #endregion

        #region Event Handle

        #region View

        private void Exportacoes_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.CarregarTipoArquivo();
            CboTipoArquivo.SelectionChanged += new SelectionChangedEventHandler(CboTipoArquivo_SelectionChanged);
            CboDataMovimentoErroAlocaoComitentes.SelectionChanged +=new SelectionChangedEventHandler(CboDataMovimentoErroAlocaoComitentes_SelectionChanged);
        }

        private void Exportacoes_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (this.PresenterAtual.IsRunning)
            {
                SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ImportacaoExportacao.Message.ExpFechaJanela").ToString(),
                                  SinacorMessageBoxButton.YesNo,
                                  SinacorMessageBoxImage.Question);

                if (result != SinacorMessageBoxResult.Yes)
                    e.Cancel = true;
            }
        }

        #endregion

        private void ChkBroker_Click(object sender, RoutedEventArgs e)
        {
            this.ControlarBroker();
        }

        private void Cancelar_Click(object sender, RoutedEventArgs e, int clickCount)
        {
            this.PresenterAtual.Cancelar();
        }

        private void BtnExportarErroAlocaoComitentes_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Parameter.FiltroExportacaoAlocacao filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoAlocacao;

            if (RdbD0.IsChecked.Value)
                filtro.Prazo = Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.Prazo.D0;
            else if (RdbD1.IsChecked.Value)
                filtro.Prazo = Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.Prazo.D1;
            else
                filtro.Prazo = Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.Prazo.Total;

            BtnExportar_OnBufferedClick(sender, e, clickCount);
        }
        
        private void BtnExportarFINA_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Parameter.FiltroExportacaoFinanceiro filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoFinanceiro;

            if (RbtExportarFINABroker.IsChecked.HasValue
                && RbtExportarFINABroker.IsChecked.Value)
            {
                filtro.TipoFormatoFinanceiro = Model.Enum.TipoFormatoFinanceiro.Broker;
            }
            else
            {
                filtro.TipoFormatoFinanceiro = Model.Enum.TipoFormatoFinanceiro.Clubes;
            }

            BtnExportar_OnBufferedClick(sender, e, clickCount);
        }

        private void BtnExportarMovimentoClube_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Parameter.FiltroExportacaoMovimentoClube filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoMovimentoClube;

            if (RdbD0MovClube.IsChecked.Value) filtro.Prazo = Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.Prazo.D0;
            if (RdbD1MovClube.IsChecked.Value) filtro.Prazo = Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.Prazo.D1;
            if (RdbTotalMovClube.IsChecked.Value) filtro.Prazo = Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.Prazo.Total;

            BtnExportar_OnBufferedClick(sender, e, clickCount);
        }
        
        private void BtnExportar_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ClearServiceErrors();
            this.PresenterAtual.Executar();
        }

        private void CboTipoArquivo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (CboTipoArquivo.SelectedValue != null)
            {
                EnumWrapper<Model.Enum.TipoArquivo> tipoArquivo = (EnumWrapper<Model.Enum.TipoArquivo>)CboTipoArquivo.SelectedValue;

                if (tipoArquivo != null)
                {
                    this.ShowUserWaitingProcess();
                    if (this.PresenterAtual.Filtro.TipoArquivo == tipoArquivo.Value)
                        this.PresenterAtual.Filtro.TipoArquivo = new Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.TipoArquivo();

                    this.PresenterAtual.Filtro.TipoArquivo = tipoArquivo.Value;
                    this.HideUserWaitingProcess();
                }

                PresenterAtual.LimparStatus();

                FinalizarExportacao(true);
            }
            else
                this.EsconderParametros();
        }

        private void CboDataMovimentoErroAlocaoComitentes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

            if (CboDataMovimentoErroAlocaoComitentes.SelectedIndex > 0)
            {
                RdbD0.IsEnabled = false;
                RdbTotal.IsEnabled = false;
                RdbD1.IsChecked = true;
            }
            else
            {
                RdbD0.IsEnabled = true;
                RdbTotal.IsEnabled = true;
                RdbTotal.IsChecked = true;
            }

        }

        private void FpcArquivo_Validating(object sender, ValidatingEventArgs e)
        {
            string arquivo = string.Empty;
            string root;

            e.Result = new ValidationResult(true, string.Empty);

            if (e.Value != null)
            {
                arquivo = e.Value.ToString();

                if (!String.IsNullOrEmpty(arquivo))
                {
                    arquivo = arquivo.Trim();

                    if (String.IsNullOrEmpty(arquivo))
                    {
                        e.Result = new ValidationResult(false, "Bovespa.ImportacaoExportacao.Message.CaminhoArquivoNaoExiste");
                    }
                    else
                    {
                        root = Path.GetPathRoot(arquivo).ToUpper();

                        if (String.IsNullOrEmpty(root)
                            || !Directory.GetLogicalDrives().Contains(root))
                        {
                            e.Result = new ValidationResult(false, "Bovespa.ImportacaoExportacao.Message.CaminhoArquivoNaoExiste");
                        }
                        else
                        {
                            if (!String.IsNullOrEmpty(Path.GetDirectoryName(arquivo))
                                && !Directory.Exists(Path.GetDirectoryName(arquivo)))
                            {
                                e.Result = new ValidationResult(false, "Bovespa.ImportacaoExportacao.Message.CaminhoArquivoNaoExiste");
                            }
                        }
                    }
                }
            }

            PrepararExportacao();
        }

        private void Exportacoes_LostFocus(object sender, RoutedEventArgs e)
        {
            PrepararExportacao();

            this.LostFocus -= Exportacoes_LostFocus;
        }

        #region Consultas de Cliente

        private void BtnConsultaClientesBroker_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Parameter.FiltroExportacaoNegocio filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoNegocio;
            Model.Cliente cliente = null;

            if (filtro != null)
            {
                cliente = this.PesquisarClientes(filtro.BrokerCliente.Apelido);

                if (cliente != null)
                    filtro.BrokerCliente = cliente;

                TxtClienteNEGS.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void BtnConsultaClientes_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Parameter.FiltroExportacaoNegocio filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoNegocio;
            Model.Cliente cliente = null;

            if (filtro != null)
            {
                cliente = this.PesquisarClientes(filtro.Broker.Apelido);

                if (cliente != null)
                    filtro.Broker = cliente;

                TxtBrokerNEGS.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void BtnConsultaClientesComitentes_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Parameter.FiltroExportacaoAlocacao filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoAlocacao;
            Model.Cliente cliente = null;

            if (filtro != null)
            {
                cliente = this.PesquisarClientes(filtro.Broker.Apelido);

                if (cliente != null)
                    filtro.Broker = cliente;
                
                TxtCodigoBroker.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void BtnExportarFINAConsultaBroker_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Parameter.FiltroExportacaoFinanceiro filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoFinanceiro;
            Model.Cliente cliente = null;

            if (filtro != null)
            {
                cliente = this.PesquisarClientes(filtro.ApelidoBroker);

                if (cliente != null)
                {
                    filtro.ApelidoBroker = cliente.Apelido;
                    filtro.CodigoBroker = cliente.Codigo;
                }

                TxtExportarFINACodigoBroker.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void BtnExportarFINAConsultaClientes_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Parameter.FiltroExportacaoFinanceiro filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoFinanceiro;
            Model.Cliente cliente = null;

            if (filtro != null)
            {
                cliente = this.PesquisarClientes(filtro.ApelidoCliente);

                if (cliente != null)
                {
                    filtro.ApelidoCliente = cliente.Apelido;
                    filtro.CodigoCliente = cliente.Codigo;
                }

                TxtExportarFINACodigoCliente.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        #endregion

        #region Validacoes NEGS

        private void TxtBrokerNEGS_Validating(object sender, ValidatingEventArgs e)
        {
            Model.Parameter.FiltroExportacaoNegocio filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoNegocio;
            
            e.Result = new ValidationResult(true, "");

            if (filtro != null &&
                filtro.Broker != null &&
                e.Value != null && !string.IsNullOrEmpty(e.Value.ToString()))
            {
                this.PresenterAtual.VerificarCliente(e.Value.ToString());

                if (this.PresenterAtual.ClienteAtual == null)
                {
                    filtro.Broker.Codigo = null;
                    e.Result = new ValidationResult(false, "Bovespa.ImportacaoExportacao.Message.BrokerNaoEncontrado");
                }
                else
                {
                    filtro.Broker.Codigo = this.PresenterAtual.ClienteAtual.Codigo;
                }
            }
            else
                filtro.Broker.Codigo = null;
        }

        private void TxtClienteNEGS_Validating(object sender, ValidatingEventArgs e)
        {
            Model.Parameter.FiltroExportacaoNegocio filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoNegocio;

            e.Result = new ValidationResult(true, "");

            if (filtro != null &&
                filtro.BrokerCliente != null &&
                e.Value != null && !string.IsNullOrEmpty(e.Value.ToString()))
            {
                this.PresenterAtual.VerificarCliente(e.Value.ToString());

                if (this.PresenterAtual.ClienteAtual == null)
                {
                    filtro.BrokerCliente.Codigo = null;
                    e.Result = new ValidationResult(false, "Bovespa.ImportacaoExportacao.Message.ClienteNaoEncontrado");
                }
                else
                {
                    filtro.BrokerCliente.Codigo = this.PresenterAtual.ClienteAtual.Codigo;
                }
            }
            else
                filtro.BrokerCliente.Codigo = null;
        }

        #endregion

        #region Validacoes Erros Alocacao Comitentes

        private void TxtCodigoBroker_Validating(object sender, ValidatingEventArgs e)
        {
            Model.Parameter.FiltroExportacaoAlocacao filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoAlocacao;

            e.Result = new ValidationResult(true, "");

            if (filtro != null &&
                filtro.Broker != null &&
                e.Value != null && !string.IsNullOrEmpty(e.Value.ToString()))
            {
                this.PresenterAtual.VerificarCliente(e.Value.ToString());

                if (this.PresenterAtual.ClienteAtual == null)
                {
                    filtro.Broker.Codigo = null;
                    e.Result = new ValidationResult(false, "Bovespa.ImportacaoExportacao.Message.BrokerNaoEncontrado");
                }
                else
                {
                    filtro.Broker.Codigo = this.PresenterAtual.ClienteAtual.Codigo;
                }
            }
            else
                filtro.Broker.Codigo = null;
        }

        #endregion

        #region Exportacao de Financeiro

        private void RbtExportarFINA_Checked(object sender, RoutedEventArgs e)
        {
            Model.Parameter.FiltroExportacaoFinanceiro filtro = null;

            if (RbtExportarFINABroker.IsChecked.HasValue
                && RbtExportarFINABroker.IsChecked.Value)
            {
                TxtExportarFINACodigoBroker.IsEnabled = true;
                TxtExportarFINACodigoCliente.IsEnabled = true;
                BtnExportarFINAConsultaBroker.IsEnabled = true;
                BtnExportarFINAConsultaClientes.IsEnabled = true;
            }
            else if (RbtExportarFINAClubesInvestimento.IsChecked.HasValue
                && RbtExportarFINAClubesInvestimento.IsChecked.Value)
            {
                TxtExportarFINACodigoBroker.IsEnabled = false;
                TxtExportarFINACodigoCliente.IsEnabled = false;
                BtnExportarFINAConsultaBroker.IsEnabled = false;
                BtnExportarFINAConsultaClientes.IsEnabled = false;
            }

            filtro = (Model.Parameter.FiltroExportacaoFinanceiro)PresenterAtual.Filtro;
            filtro.CodigoBroker = null;
            filtro.CodigoCliente = null;
            filtro.ApelidoCliente = null;
            filtro.ApelidoBroker = null;

            TxtExportarFINACodigoBroker.UpdateTarget(SinacorTextBox.TextProperty);
            TxtExportarFINACodigoCliente.UpdateTarget(SinacorTextBox.TextProperty);
        }

        private void TxtExportarFINACodigoBroker_Validating(object sender, ValidatingEventArgs e)
        {
            Model.Parameter.FiltroExportacaoFinanceiro filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoFinanceiro;

            e.Result = new ValidationResult(true, "");

            if (filtro != null &&
                filtro.ApelidoBroker != null &&
                e.Value != null && !string.IsNullOrEmpty(e.Value.ToString()))
            {
                this.PresenterAtual.VerificarCliente(e.Value.ToString());

                if (this.PresenterAtual.ClienteAtual == null)
                {
                    filtro.CodigoBroker = null;
                    e.Result = new ValidationResult(false, "Bovespa.ImportacaoExportacao.Message.BrokerNaoEncontrado");
                }
                else
                {
                    filtro.CodigoBroker = this.PresenterAtual.ClienteAtual.Codigo;
                }
            }
            else
            {
                filtro.CodigoBroker = null;
            }
        }

        private void TxtExportarFINACodigoCliente_Validating(object sender, ValidatingEventArgs e)
        {
            Model.Parameter.FiltroExportacaoFinanceiro filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoFinanceiro;

            e.Result = new ValidationResult(true, "");

            if (filtro != null &&
                filtro.ApelidoCliente != null &&
                e.Value != null && !string.IsNullOrEmpty(e.Value.ToString()))
            {
                this.PresenterAtual.VerificarCliente(e.Value.ToString());

                if (this.PresenterAtual.ClienteAtual == null)
                {
                    filtro.CodigoCliente = null;
                    e.Result = new ValidationResult(false, "Bovespa.ImportacaoExportacao.Message.ClienteNaoEncontrado");
                }
                else
                {
                    filtro.CodigoCliente = this.PresenterAtual.ClienteAtual.Codigo;
                }
            }
            else
            {
                filtro.CodigoCliente = null;
            }
        }

        #endregion

        #endregion

        #region Metodos

        private void PrepararExportacao()
        {
            PresenterAtual.LimparStatus();

            BtnExportarNEGS.IsEnabled = true;
            BtnExportarErroAlocaoComitentes.IsEnabled = true;
            BtnExportarTORDIST.IsEnabled = true;
            BtnExportarFINA.IsEnabled = true;
            BtnExportarMovimentoClube.IsEnabled = true;
        }

        private Model.Cliente PesquisarClientes(String apelido)
        {
            Model.Cliente retorno = null;
            PesquisaClientes pesquisaClientes = new PesquisaClientes();

            Clientes.Model.PesquisaCliente filtroPesq = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente();
            filtroPesq.Apelido = apelido;

            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.ManutencaoOrdens, filtroPesq);

            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Ordens.Label.ManutencaoOrdens");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo.HasValue && pesquisaClientes.PesquisaClienteModel.Codigo > 0)
            {
                retorno = new Model.Cliente
                {
                    Codigo = pesquisaClientes.PesquisaClienteModel.Codigo,
                    Apelido = pesquisaClientes.PesquisaClienteModel.Apelido
                };
            }

            pesquisaClientes = null;

            return retorno;
        }

        private void ControlarBroker()
        {
            Model.Parameter.FiltroExportacaoAlocacao filtro = null;

            if (!ChkExpecificacaoBroker.IsChecked.Value && !ChkClientesBroker.IsChecked.Value)
            {
                filtro = this.PresenterAtual.Filtro as Model.Parameter.FiltroExportacaoAlocacao;
                filtro.Broker.Apelido = string.Empty;
                TxtCodigoBroker.UpdateTarget(SinacorInt32TextBox.ValueProperty);

                TxtCodigoBroker.IsEnabled = false;
                BtnConsultaClientesComitentes.IsEnabled = false;
            }
            else
            {
                TxtCodigoBroker.IsEnabled = true;
                BtnConsultaClientesComitentes.IsEnabled = true;
            }
        }

        private void CarregarTipoArquivo()
        {
            if (PresenterAtual.Filtro.TipoSistema == Model.Enum.TipoSistema.Bolsa)
            {
                CboTipoArquivo.ItemsSource = EnumWrapper<Model.Enum.TipoArquivo>.GetEnums(
                    Model.Enum.TipoArquivo.NEGS,
                    Model.Enum.TipoArquivo.NEGSXML,
                    Model.Enum.TipoArquivo.IESC,
                    Model.Enum.TipoArquivo.TORDIST,
                    Model.Enum.TipoArquivo.MOVCLUBE);
            }
            else
            {
                CboTipoArquivo.ItemsSource = EnumWrapper<Model.Enum.TipoArquivo>.GetEnums(
                    Model.Enum.TipoArquivo.NEGS,
                    Model.Enum.TipoArquivo.NEGSXML,
                    Model.Enum.TipoArquivo.IESC,
                    Model.Enum.TipoArquivo.TORDIST,
                    Model.Enum.TipoArquivo.FINA);
            }

            CboTipoArquivo.SelectedIndex = -1;
        }

        private void EsconderParametros()
        {
            GrpParametrosErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpParametrosNEGS.Visibility = Visibility.Collapsed;
            GrpParametrosTORDIST.Visibility = Visibility.Collapsed;
            GrpParametrosFINA.Visibility = Visibility.Collapsed;
            GrpParametrosMovimentacaoClubes.Visibility = Visibility.Collapsed;

            PresenterAtual.Filtro.TipoArquivo = Model.Enum.TipoArquivo.Padrao;

            FpcArquivo.Filter = "";
        }

        private void FinalizarExportacao(bool botoesExportaacoLigados)
        {
            BtnCancelarErroAlocaoComitentes.IsEnabled = false;
            BtnCancelarNEGS.IsEnabled = false;
            BtnCancelarTORDIST.IsEnabled = false;
            BtnCancelarFINA.IsEnabled = false;
            BtnCancelarMovimentoClube.IsEnabled = false;

            BtnExportarErroAlocaoComitentes.IsEnabled = botoesExportaacoLigados;
            BtnExportarNEGS.IsEnabled = botoesExportaacoLigados;
            BtnExportarTORDIST.IsEnabled = botoesExportaacoLigados;
            BtnExportarFINA.IsEnabled = botoesExportaacoLigados;
            BtnExportarMovimentoClube.IsEnabled = botoesExportaacoLigados;
        }

        private void IniciarObjetos(Model.Enum.TipoSistema tipoSistema)
        {
            Presenter.Exportacoes presenterExportacoes;

            presenterExportacoes = new Presenter.Exportacoes(this);
            presenterExportacoes.Filtro.TipoSistema = tipoSistema;

            this.PresenterAtual = presenterExportacoes;
            this.DataContext = this.PresenterAtual;

            this.AfterInitialize += new RoutedEventHandler(Exportacoes_AfterInitialize);

            BtnExportarNEGS.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnExportar_OnBufferedClick);
            BtnCancelarNEGS.OnBufferedClick += new SinacorButton.OnBufferClickHandler(Cancelar_Click);

            BtnExportarErroAlocaoComitentes.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnExportarErroAlocaoComitentes_OnBufferedClick);
            BtnCancelarErroAlocaoComitentes.OnBufferedClick += new SinacorButton.OnBufferClickHandler(Cancelar_Click);

            BtnExportarTORDIST.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnExportar_OnBufferedClick);
            BtnCancelarTORDIST.OnBufferedClick += new SinacorButton.OnBufferClickHandler(Cancelar_Click);

            BtnExportarFINA.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnExportarFINA_OnBufferedClick);
            BtnCancelarFINA.OnBufferedClick += new SinacorButton.OnBufferClickHandler(Cancelar_Click);
            RbtExportarFINABroker.Checked += new RoutedEventHandler(RbtExportarFINA_Checked);
            RbtExportarFINAClubesInvestimento.Checked += new RoutedEventHandler(RbtExportarFINA_Checked);

            ChkExpecificacaoBroker.Click += new RoutedEventHandler(ChkBroker_Click);
            ChkClientesBroker.Click += new RoutedEventHandler(ChkBroker_Click);

            BtnConsultaClientes.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnConsultaClientes_OnBufferedClick);
            BtnConsultaClientesBroker.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnConsultaClientesBroker_OnBufferedClick);
            BtnConsultaClientesComitentes.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnConsultaClientesComitentes_OnBufferedClick);
            BtnExportarFINAConsultaClientes.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnExportarFINAConsultaClientes_OnBufferedClick);
            BtnExportarFINAConsultaBroker.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnExportarFINAConsultaBroker_OnBufferedClick);

            BtnExportarMovimentoClube.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnExportarMovimentoClube_OnBufferedClick);
            BtnCancelarMovimentoClube.OnBufferedClick += new SinacorButton.OnBufferClickHandler(Cancelar_Click);

            this.Closing += new System.ComponentModel.CancelEventHandler(Exportacoes_Closing);
        }
        
        private void AtivarExportacaoNEGS()
        {
            this.AtivarNegocio();

            FpcArquivo.Filter = "Text files (*.txt)|*.txt|Dat files (*.dat)|*.dat|Dta files (*.dta)|*.dta|All files (*.*)|*.*";
        }

        private void AtivarExportacaoNEGSXML()
        {
            this.AtivarNegocio();

            FpcArquivo.Filter = "XML files (*.xml)|*.xml";
        }

        private void AtivarNegocio()
        {
            Model.Parameter.IFiltroImportacaoExportacao filtro = null;

            if (PresenterAtual.GetType() != typeof(Presenter.ExportacaoNegocio))
            {
                PresenterAtual.Dispose();

                filtro = this.PresenterAtual.Filtro;

                PresenterAtual = new Presenter.ExportacaoNegocio(this, filtro);
                this.DataContext = PresenterAtual;

                this.PresenterAtual.Inicializar();
            }

            GrpParametrosNEGS.Visibility = Visibility.Visible;
            GrpParametrosErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpParametrosTORDIST.Visibility = Visibility.Collapsed;
            GrpParametrosFINA.Visibility = Visibility.Collapsed;
            GrpParametrosMovimentacaoClubes.Visibility = Visibility.Collapsed;

            TxtClienteNEGS.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            TxtBrokerNEGS.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            CboDataMovimentoNEGS.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            CboDataMovimentoNEGS.SelectedIndex = 0;

            FpcArquivo.UpdateTarget(SinacorFilePicker.ValueProperty);
        }

        private void AtivarExportacaoTORDIST()
        {
            if (PresenterAtual.GetType() != typeof(Presenter.ExportacaoDistribuicao))
            {
                PresenterAtual.Dispose();

                PresenterAtual = new Presenter.ExportacaoDistribuicao(this, this.PresenterAtual.Filtro);
                this.DataContext = PresenterAtual;

                this.PresenterAtual.Inicializar();
            }

            GrpParametrosNEGS.Visibility = Visibility.Collapsed;
            GrpParametrosErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpParametrosTORDIST.Visibility = Visibility.Visible;
            GrpParametrosFINA.Visibility = Visibility.Collapsed;
            GrpParametrosMovimentacaoClubes.Visibility = Visibility.Collapsed;

            CboDataMovimentoTORDIST.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            CboDataMovimentoTORDIST.SelectedIndex = 0;

            TxtCorrespondenteTORDIST.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            this.PresenterAtual.Filtro.NomeArquivo = string.Empty;
            FpcArquivo.UpdateTarget(SinacorFilePicker.ValueProperty);

            FpcArquivo.Filter = "Text files (*.txt)|*.txt|Dat files (*.dat)|*.dat|Dta files (*.dta)|*.dta|All files (*.*)|*.*";
        }

        private void AtivarExportacaoIESC()
        {
            Model.Parameter.IFiltroImportacaoExportacao filtro = null;
            
            if (PresenterAtual.GetType() != typeof(Presenter.ExportacaoAlocacao))
            {
                PresenterAtual.Dispose();

                filtro = this.PresenterAtual.Filtro;

                PresenterAtual = new Presenter.ExportacaoAlocacao(this, filtro);
                this.DataContext = PresenterAtual;

                this.PresenterAtual.Inicializar();
            }

            GrpParametrosNEGS.Visibility = Visibility.Collapsed;
            GrpParametrosErroAlocaoComitentes.Visibility = Visibility.Visible;
            GrpParametrosTORDIST.Visibility = Visibility.Collapsed;
            GrpParametrosFINA.Visibility = Visibility.Collapsed;
            GrpParametrosMovimentacaoClubes.Visibility = Visibility.Collapsed;

            CboDataMovimentoErroAlocaoComitentes.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            CboDataMovimentoErroAlocaoComitentes.SelectedIndex = 0;

            TxtCodigoBroker.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            RdbD0.IsChecked = false;
            RdbD1.IsChecked = false;
            RdbTotal.IsChecked = true;

            ChkExpecificacaoBroker.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ChkClientesBroker.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ChkApenasClientesQualificados.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ChkAlocacoesNaoConfirmadas.UpdateTarget(SinacorCheckBox.IsCheckedProperty);

            TxtCodigoBroker.IsEnabled = false;
            BtnConsultaClientesComitentes.IsEnabled = false;

            filtro.NomeArquivo = string.Empty;
            FpcArquivo.UpdateTarget(SinacorFilePicker.ValueProperty);
            FpcArquivo.Filter = "Text files (*.txt)|*.txt|Dat files (*.dat)|*.dat|Dta files (*.dta)|*.dta|All files (*.*)|*.*";
        }

        private void AtivarExportacaoFINA()
        {
            Model.Parameter.IFiltroImportacaoExportacao filtro = null;

            if (PresenterAtual.GetType() != typeof(Presenter.ExportacaoFinanceiro))
            {
                PresenterAtual.Dispose();

                filtro = this.PresenterAtual.Filtro;

                PresenterAtual = new Presenter.ExportacaoFinanceiro(this, filtro);
                this.DataContext = PresenterAtual;

                this.PresenterAtual.Inicializar();
            }

            CboDataMovimentoFINA.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            CboDataMovimentoFINA.SelectedIndex = 0;
            
            GrpParametrosNEGS.Visibility = Visibility.Collapsed;
            GrpParametrosErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpParametrosTORDIST.Visibility = Visibility.Collapsed;
            GrpParametrosFINA.Visibility = Visibility.Visible;
            GrpParametrosMovimentacaoClubes.Visibility = Visibility.Collapsed;

            RbtExportarFINABroker.IsChecked = true;

            filtro.NomeArquivo = string.Empty;
            FpcArquivo.UpdateTarget(SinacorFilePicker.ValueProperty);

            FpcArquivo.Filter = "XML files (*.xml)|*.xml";
        }

        private void AtivarExportacaoMOVCLUBE()
        {
            Model.Parameter.IFiltroImportacaoExportacao filtro = null;

            if (PresenterAtual.GetType() != typeof(Presenter.ExportacaoMovimentoClube))
            {
                PresenterAtual.Dispose();

                filtro = this.PresenterAtual.Filtro;

                PresenterAtual = new Presenter.ExportacaoMovimentoClube(this, filtro);
                this.DataContext = PresenterAtual;

                this.PresenterAtual.Inicializar();
            }

            GrpParametrosNEGS.Visibility = Visibility.Collapsed;
            GrpParametrosErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpParametrosTORDIST.Visibility = Visibility.Collapsed;
            GrpParametrosFINA.Visibility = Visibility.Collapsed;
            GrpParametrosMovimentacaoClubes.Visibility = Visibility.Visible;

            CboDataMovimentoClube.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            CboDataMovimentoClube.SelectedIndex = 0;

            filtro.NomeArquivo = string.Empty;
            FpcArquivo.UpdateTarget(SinacorFilePicker.ValueProperty);

            FpcArquivo.Filter = "Text files (*.txt)|*.txt|Dat files (*.dat)|*.dat|Dta files (*.dta)|*.dta|All files (*.*)|*.*";
        }

        #endregion

        #region IImportacaoExportacaoBase Members

        public void AlterarPresenter(Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.TipoArquivo tipoArquivo)
        {
            if (this.PresenterAtual.VerificarPermissao())
            {                
                FpcArquivo.Value = string.Empty;
                
                switch (tipoArquivo)
                {
                    case Model.Enum.TipoArquivo.NEGS:
                        this.AtivarExportacaoNEGS();
                        break;
                    case Model.Enum.TipoArquivo.NEGSXML:
                        this.AtivarExportacaoNEGSXML();
                        break;
                    case Model.Enum.TipoArquivo.IESC:
                        this.AtivarExportacaoIESC();
                        break;
                    case Model.Enum.TipoArquivo.TORDIST:
                        this.AtivarExportacaoTORDIST();
                        break;
                    case Model.Enum.TipoArquivo.FINA:
                        this.AtivarExportacaoFINA();
                        break;
                    case Model.Enum.TipoArquivo.MOVCLUBE:
                        this.AtivarExportacaoMOVCLUBE();
                        break;
                    default:
                        this.EsconderParametros();
                        break;
                }
            }
        }

        public void InformarImportacaoConcluida()
        {
            //Não será utilizado na exportação
            throw new NotImplementedException();
        }

        public void InformarExportacaoConcluida()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.FinalizarExportacao(true);

                SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ExportacaoConcluida").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Information);

                this.LostFocus += new RoutedEventHandler(Exportacoes_LostFocus);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void InformarExportacaoConcluidaComErro()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.FinalizarExportacao(true);

                SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ExportacaoConcluidaComErro").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Exclamation);

                this.LostFocus += new RoutedEventHandler(Exportacoes_LostFocus);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void InformarImportacaoCancelada()
        {
            //Não será utilizado na exportação
            throw new NotImplementedException();
        }

        public void InformarExportacaoCancelada()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.FinalizarExportacao(true);

                SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ExportacaoCancelada").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Exclamation);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public bool ConfirmarCancelamento()
        {
            bool retorno = (SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ConfirmaCancelamentoOperacao").ToString(),
                                  SinacorMessageBoxButton.YesNo,
                                  SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes);

            if (retorno)
            {
                BtnCancelarErroAlocaoComitentes.IsEnabled = false;
                BtnCancelarNEGS.IsEnabled = false;
                BtnCancelarTORDIST.IsEnabled = false;
                BtnCancelarFINA.IsEnabled = false;
                BtnCancelarMovimentoClube.IsEnabled = false;
                PgbProgresso.ProgressBarText = this.FindResource("Bovespa.ImportacaoExportacao.Label.ProcessandoCancelamento").ToString();
            }

            return retorno;
        }

        public void AtualizarStatus()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                if (PresenterAtual.StatusProcesso.StartedAt == default(DateTime))
                {
                    TxtDataInicioPro.Text = "";
                    TxtHoraInicioPro.Text = "";
                }
                else
                {
                    TxtDataInicioPro.Text = PresenterAtual.StatusProcesso.StartedAt.ToString("d");
                    TxtHoraInicioPro.Text = PresenterAtual.StatusProcesso.StartedAt.ToString("t");
                }

                if (PresenterAtual.StatusProcesso.FinalizedAt == default(DateTime))
                {
                    TxtDataFimPro.Text = "";
                    TxtHoraFimPro.Text = "";
                }
                else
                {
                    TxtDataFimPro.Text = PresenterAtual.StatusProcesso.StartedAt.ToString("d");
                    TxtHoraFimPro.Text = PresenterAtual.StatusProcesso.StartedAt.ToString("t");
                }

                if (String.IsNullOrEmpty(PresenterAtual.StatusProcesso.Step))
                {
                    PgbProgresso.ProgressBarText = " ";
                }
                else
                {
                    PgbProgresso.ProgressBarText = FindResource(PresenterAtual.StatusProcesso.Step).ToString();
                }

                PgbProgresso.UpdateTarget(SinacorProgressBar.ValueProperty);
            });
        }

        public void HabilitarCancelamentoProcesso()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                BtnCancelarNEGS.IsEnabled = true;
                BtnCancelarErroAlocaoComitentes.IsEnabled = true;
                BtnCancelarTORDIST.IsEnabled = true;
                BtnCancelarFINA.IsEnabled = true;
                BtnCancelarMovimentoClube.IsEnabled = true;

                BtnExportarNEGS.IsEnabled = false;
                BtnExportarErroAlocaoComitentes.IsEnabled = false;
                BtnExportarTORDIST.IsEnabled = false;
                BtnExportarFINA.IsEnabled = false;
                BtnExportarMovimentoClube.IsEnabled = false;
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void DesabilitarCancelamentoProcesso()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                BtnCancelarNEGS.IsEnabled = false;
                BtnCancelarErroAlocaoComitentes.IsEnabled = false;
                BtnCancelarTORDIST.IsEnabled = false;
                BtnCancelarFINA.IsEnabled = false;
                BtnCancelarMovimentoClube.IsEnabled = false;

                BtnExportarNEGS.IsEnabled = true;
                BtnExportarErroAlocaoComitentes.IsEnabled = true;
                BtnExportarTORDIST.IsEnabled = true;
                BtnExportarFINA.IsEnabled = true;
                BtnExportarMovimentoClube.IsEnabled = true;
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public bool ConfirmarImportacao()
        {
            //Não será utilizado na exportação
            throw new NotImplementedException();
        }

        public bool ConfirmarExportacao()
        {
            return (SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ConfirmaExportacao").ToString(),
                                  SinacorMessageBoxButton.YesNo,
                                  SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes);
        }

        public void InformarErroImportacao()
        {
            //Não será utilizado na exportação
            throw new NotImplementedException();
        }

        public void InformarErroExportacao()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                FinalizarExportacao(true);

                this.LostFocus += new RoutedEventHandler(Exportacoes_LostFocus);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void InformarUsuarioSemPermissao()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.UsuarioSemPermissaoImportacao").ToString(),
                                  SinacorMessageBoxButton.Ok,
                                  SinacorMessageBoxImage.Exclamation);
        }

        public void InformarArquivoInvalido()
        {
            //Não será utilizado na exportação
        }

        public void AtualizarListaCalendario()
        {
            CboDataMovimentoNEGS.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            CboDataMovimentoErroAlocaoComitentes.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            CboDataMovimentoTORDIST.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            CboDataMovimentoFINA.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            CboDataMovimentoClube.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void AtualizarListaTipoArquivo()
        {
            CboTipoArquivo.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void InformarDataInvalida()
        {
            //Não utilizado na exportação
            throw new NotImplementedException();
        }

        #endregion
    }
}
